<?php
// +----------------------------------------------------------------------
// | Name 风音框架
// +----------------------------------------------------------------------
// | Author 唐启云 <tqy@fxri.net>
// +----------------------------------------------------------------------
// | Copyright Copyright © 2016-2099 方弦研究所. All rights reserved.
// +----------------------------------------------------------------------
// | Link https://www.fxri.net
// +----------------------------------------------------------------------

namespace fxsafe\facade;

/**
 * 用户类
 */
class User
{
    /**
     * 解析数据-密码
     * @param string $password 密码
     * @param array $option 选项
     * @return mixed
     */
    public function password($password = null, $option = [])
    {
        // 初始化变量
        $echo = \fxsafe\Server::view();
        $config = \fxsafe\Config::get('app.password');
        // 疏理选项
        $predefined = [
            // 类型
            'type' => $config['type'],
            // 数量
            'number' => $config['number'],
            // 最小长度
            'min_length' => $config['min_length'],
            // 最大长度
            'max_length' => $config['max_length'],
        ];
        $option = \fxsafe\Param::define([$option, $predefined], '1.1.2');
        // 疏理选项
        $option['score'] = 0;
        $option['success'] = false;
        $option['length'] = mb_strlen($password, 'utf-8');
        // 疏理密码配置
        $option['type'] = strtolower($option['type']);
        switch ($option['type']) {
            default:
                // 默认
            case 'string':
                // 字符串
                if (preg_match('/[0-9]+/', $password)) {
                    ++$option['score'];
                }
                if (preg_match('/[a-z]+/', $password)) {
                    ++$option['score'];
                }
                if (preg_match('/[A-Z]+/', $password)) {
                    ++$option['score'];
                }
                if (preg_match('/[^0-9a-zA-Z]+/', $password)) {
                    ++$option['score'];
                }
                if ($option['score'] >= $option['number']) {
                    $option['success'] = true;
                }
                // 疏理消息
                $option['message'] = '请输入长度' . $option['min_length'] . '-' . $option['max_length'] . '位，由英文大写、英文小写、数字、特殊字符任意' . $option['number'] . '种组合的密码';
                break;
            case 'number':
                // 数字
                if (preg_match('/[0-9]+/', $password)) {
                    ++$option['score'];
                }
                if (preg_match('/[^0-9]+/', $password)) {
                    --$option['score'];
                }
                if ($option['score'] >= 1) {
                    $option['success'] = true;
                }
                // 疏理消息
                $option['message'] = '请输入长度' . $option['min_length'] . '-' . $option['max_length'] . '位，由纯数字组合的密码';
                break;
        }
        // 校验密码
        if ($option['length'] < $option['min_length'] || $option['length'] > $option['max_length']) {
            // 校验密码长度
            $echo[0] = false;
            $echo[1] = 1001;
            $echo[2] = $option['message'];
            return $echo;
        } else if (!$option['success']) {
            // 校验密码强度
            $echo[0] = false;
            $echo[1] = 1002;
            $echo[2] = $option['message'];
            return $echo;
        }
        return $echo;
    }

    /**
     * 发送登录日志
     * @param string $data 数据
     * @return mixed
     */
    public function loginSocket($data = null)
    {
        // 初始化变量
        $config = \fxsafe\Config::get('app.socket');
        // 发送远程日志
        if ($config['switch']) {
            $data = \fxsafe\Base::json($data, 'encode');
            return \fxsafe\Socket::udpSend(base64_encode($data) . "\n", $config['host'], $config['port']);
        }
        return false;
    }

    /**
     * 读写登录日志
     * @param string $name 名称
     * @param string $data 数据
     * @return mixed
     */
    public function loginLog($name = null, $data = null)
    {
        // 初始化变量
        $config = \fxsafe\Config::get('app.login');
        $tray['now'] = date('Y-m-d H:i:s');
        if ($name == 'client') {
            $name = \fxsafe\Client::ip(0);
        }
        // 读取日志文件
        $datas = $this->logFile(null, $config['file_name']);
        // 疏理日志
        $predefined = [
            // 客户端IP
            'ip' => $name,
            // 失败次数
            'fail_count' => 0,
            // 失败账号
            'fail_account' => [],
            // 记录时间
            'dateline' => $tray['now'],
        ];
        // 检查数据
        if (is_blank($data) && !is_blank($name)) {
            // 疏理日志
            $datas[$name] = isset($datas[$name]) ? $datas[$name] : null;
            if (isset($datas[$name]['dateline']) && strtotime($datas[$name]['dateline']) < time() - $config['lock_expire']) {
                $datas[$name]['fail_count'] = 0;
                $datas[$name]['dateline'] = $tray['now'];
            }
            $datas[$name] = \fxsafe\Param::define([$datas[$name], $predefined], '1.1.2');
            // 读取日志
            $echo = $datas[$name];
        } else if (is_blank($data)) {
            // 读取日志
            $echo = $datas;
        } else {
            // 疏理日志
            $datas[$name] = \fxsafe\Param::define([$data, $predefined], '1.1.2');
            // 写入日志文件
            $echo = $this->logFile($datas, $config['file_name']);
        }
        return $echo;
    }

    /**
     * 读写短信日志
     * @param string $name 名称
     * @param string $data 数据
     * @return mixed
     */
    public function smsLog($name = null, $data = null)
    {
        // 初始化变量
        $config = \fxsafe\Config::get('app.sms');
        $tray['now'] = date('Y-m-d H:i:s');
        // 读取日志文件
        $datas = $this->logFile(null, $config['file_name']);
        // 疏理日志
        $predefined = [
            // 名称
            'name' => $name,
            // 手机号
            'mobile' => null,
            // 手机号-脱敏
            'mobile_des' => null,
            // 验证码
            'code' => null,
            // 客户端IP
            'ip' => \fxsafe\Client::ip(0),
            // 有效期
            'time_limit' => date('Y-m-d H:i:s', strtotime($tray['now']) + $config['time_limit']),
            // 记录时间
            'dateline' => $tray['now'],
        ];
        // 检查数据
        if (is_blank($data) && !is_blank($name)) {
            // 疏理日志
            $datas[$name] = isset($datas[$name]) ? $datas[$name] : null;
            if (isset($datas[$name]['time_limit']) && strtotime($datas[$name]['time_limit']) < time()) {
                $datas[$name] = $predefined;
            }
            $datas[$name] = \fxsafe\Param::define([$datas[$name], $predefined], '1.1.2');
            // 读取日志
            $echo = $datas[$name];
        } else if (is_blank($data)) {
            // 读取日志
            $echo = $datas;
        } else {
            // 疏理日志
            $datas[$name] = \fxsafe\Param::define([$data, $predefined], '1.1.2');
            // 写入日志文件
            $echo = $this->logFile($datas, $config['file_name']);
        }
        return $echo;
    }

    /**
     * 读写日志文件
     * @param string $data 数据
     * @param string $name 名称
     * @return mixed
     */
    public function logFile($data = null, $name = null)
    {
        // 初始化变量
        $config = \fxsafe\Config::get('app.log');
        // 配置日志文件
        $tray['log_file'] = $config['path'] . $name;
        // 检查数据
        if (!$config['switch']) {
            $echo = false;
        } else if (is_blank($data)) {
            // 读取数据
            $data = \fxsafe\File::readFile($tray['log_file']);
            // 检查数据
            if (!is_json($data)) {
                $data = [];
            }
            // 解码数据
            $echo = \fxsafe\Base::json($data, 'decode');
        } else {
            // 检查数据
            if (!is_array($data) && !is_json($data)) {
                $data = new \stdClass();
            }
            // 编码数据
            $data = \fxsafe\Base::json($data, 'encode');
            // 写入数据
            $echo = \fxsafe\File::writeFile($tray['log_file'], $data);
        }
        return $echo;
    }
}
